<em>import <q>PropTypes</q> from 'prop-types'</em>

<em>AComponent</em>.<b>contextTypes</b> = {
	<u>optionalString</u>: 			<q>PropTypes</q>.<i>string</i>,					<em>// 字符串</em>
	<u>optionalNumber</u>: 			<q>PropTypes</q>.<i>number</i>,				<em>// 数字</em>
	<u>optionalBool</u>: 			<q>PropTypes</q>.<i>bool</i>, 					<em>// 布尔值</em>
	<u>optionalArray</u>: 			<q>PropTypes</q>.<i>array</i>,					<em>// 数组</em>
	<u>optionalObject</u>: 			<q>PropTypes</q>.<i>object</i>,					<em>// 对象</em>
	<u>optionalFunc</u>: 			<q>PropTypes</q>.<i>func</i>, 					<em>// 函数</em>
	<u>optionalSymbol</u>: 			<q>PropTypes</q>.<i>symbol</i>, 				<em>// symbol</em>
	
	<u>optionalNode</u>: 			<q>PropTypes</q>.<i>node</i>, 					<em>// dom 类型</em>
	
	<u>optionalElement</u>: 			<q>PropTypes</q>.<i>element</i>, 				<em>// 一个 React 元素, 例: </em><u>children: PropTypes.element</u>
	<u>optionalElementType</u>: 		<q>PropTypes</q>.<i>elementType</i>, 			<em>// 一个 React 元素类型（即，MyComponent）</em>
	
	<u>optionalMessage</u>: 			<q>PropTypes</q>.<i>instanceOf</i>(<em>Message</em>), 	<em>// 是否是Message对象的实例</em>
	<u>optionalEnum</u>: 			<q>PropTypes</q>.<i>oneOf</i>([<em>'a', 'b'</em>]), 			<em>// 枚举类型</em>
	
	<em># 一个对象可以是几种类型中的任意一个类型</em>
	<u>optionalUnion</u>: 			<q>PropTypes</q>.<i>oneOfType</i>(
		<em>PropTypes.string</em>,
		<em>PropTypes.number</em>,
		<em>PropTypes.instanceOf(Message)</em>
	),
	<em># 可以指定一个数组由某一类型的元素组成</em>
	<u>optionalArrayOf</u>: 			<q>PropTypes</q>.<i>arrayOf</i>(<em>PropTypes.number</em>),
	<em># 可以指定一个对象由某一类型的值组成</em>
	<u>optionalObjectOf</u>: 			<q>PropTypes</q>.<i>objectOf</i>(<em>PropTypes.number</em>),
	<em># 可以指定一个对象由特定的类型值组成</em>
	<u>optionalObjectWithShape</u>: 	<q>PropTypes</q>.<i>shape</i>(
		<em>color: PropTypes.string</em>,
		<em>fontSize: PropTypes.number</em>,
	),
	
	<u>optionalObjectWithStrictShape</u>: 	<q>PropTypes</q>.<i>exact</i>(
		<em>color: PropTypes.string</em>,
		<em>fontSize: PropTypes.number</em>,
	),
	
	<em># 必须声明</em>
	<u>requiredFunc</u>: 			<q>PropTypes.func</q>.<i>isRequired</i>, 		<em>// 类型必须声明</em>
	<u>requiredAny</u>: 				<q>PropTypes</q>.<i>any.isRequired</i>,  		<em>// 任意类型的数据必须声明</em>
	
	<em># 自定义验证器</em>
	<u>customProp</u>: 	<em>function( <s>props, propName, componentName</s> )</em>{
		<em>if (!/matchme/.test(props[propName]))</em>{
			<em>return new Error(`${ propName + componentName }`)</em>
		}
	},
	
	<em>#　自定义的 `arrayOf` 或 `objectOf` 验证器</em>
	<u>customArrayProp</u>: 	<q>PropTypes</q>.<i>arrayOf</i>( <em>function( <s>propValue, key, componentName, location, propFullName</s> )</em>{
		<em>if (!/matchme/.test(props[propName]))</em>{
			<em>return new Error(`${ propFullName +  componentName }`)</em>
		}
	}),
}